package pl.edu.project.model;

import java.util.Calendar;

/**
 * Klasa reprezentuj�ca pojedyncze zdarzenie. Przechowuje informacje
 * dotycz�ce miejsca, opisu, daty zdarzenia oraz godziny, kiedy ma
 * nast�pi� zdarzenie oraz ile wcze�niej ma wyst�pi� przypomnienie o
 * ustawionym zdarzeniu
 */
public class Event implements Comparable<Event> {

	/**
	 * Pole przechowuj�ce informacj� czy ustawiony jest alarm d�wi�kowy
	 */
	private boolean alarm;
	/**
	 * Pole przechowuj�ce czas wyst�pienia przypomnienia o zdarzeniu
	 */
	private int alarmMinutesBefore;
	/**
	 * Pole przechowuj�ce dzien z daty zdarzenia
	 */
	private int day;
	/**
	 * Pole przechowuj�ce opis zdarzenia
	 */
	private String description;
	/**
	 * Pole przechowuj�ce godzine wyst�pienia zdarzenia
	 */
	private int hour;
	/**
	 * Pole przechowuj�ce identyfikator zdarzenia
	 */
	private int id;
	/**
	 * Pole przechowuj�ce minuty z godziny wyst�pienia zdarzenia
	 */
	private int minute;
	/**
	 * Pole przechowuj�ce miesiac z daty zdarzenia
	 */
	private int month;
	/**
	 * Pole przechowuj�ce miejsce zdarzenia
	 */
	private String place;
	/**
	 * Pole przechowuj�ce rok z daty zdarzenia
	 */
	private int year;

	/**
	 * Konstruktor tworz�cy zdarzenia
	 * 
	 * @param id
	 *            - identyfikator zdarzenia
	 * @param year
	 *            - rok z daty zdarzenia
	 * @param month
	 *            - miesiac z daty zdarzenia
	 * @param day
	 *            - dzie� z daty zdarzenia
	 * @param hour
	 *            - godzina wyst�pienia zdarzenia
	 * @param minute
	 *            - minuty z godziny wyst�pienia zdarzenia
	 * @param description
	 *            - opis zdarzenia
	 * @param place
	 *            - miejsce zdarzenia
	 * @param alarm
	 *            - informacj� czy ustawiony jest alarm d�wi�kowy
	 * @param alarmMinutesBefore
	 *            - czas wyst�pienia przypomnienia o zdarzeniu
	 */
	public Event(int id, int year, int month, int day, int hour, int minute,
			String description, String place, boolean alarm,
			int alarmMinutesBefore) {
		this.id = id;
		this.year = year;
		this.month = month;
		this.day = day;
		this.hour = hour;
		this.minute = minute;
		this.description = description;
		this.place = place;
		this.alarm = alarm;
		this.alarmMinutesBefore = alarmMinutesBefore;
	}

	public Event() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Metoda por�wnuj�ca dwa zdarzenia
	 * 
	 * @param c
	 *            - obiekt klasy Calendar
	 * @return - r�nica p�l year
	 */
	public int compareTo(Calendar c) {
		if (year - c.get(Calendar.YEAR) == 0) {
			if (month - c.get(Calendar.MONTH) == 0) {
				if (day - c.get(Calendar.DAY_OF_MONTH) == 0) {
					if (hour - c.get(Calendar.HOUR_OF_DAY) == 0)
						return minute - c.get(Calendar.MINUTE);
					else
						return hour - c.get(Calendar.HOUR_OF_DAY);
				} else
					return day - c.get(Calendar.DAY_OF_MONTH);
			} else
				return month - c.get(Calendar.MONTH);
		} else
			return year - c.get(Calendar.YEAR);
	}

	/**
	 * Metoda por�wnuj�ca dwa zdarzenia
	 * 
	 * @param e
	 *            - obiekt klasy Event, zdarzenie
	 * @return - r�nica p�l year
	 */
	public int compareTo(Event e) {
		if (year - e.year == 0) {
			if (month - e.month == 0) {
				if (day - e.day == 0) {
					if (hour - e.hour == 0)
						return minute - e.minute;
					else
						return hour - e.hour;
				} else
					return day - e.day;
			} else
				return month - e.month;
		} else
			return year - e.year;
	}

	/**
	 * Metoda zwracaj�ca czas wyst�pienia przypomnienia o zdarzeniu
	 * 
	 * @return - czas wyst�pienia przypomnienia o zdarzeniu
	 */
	public int getAlarmMinutesBefore() {
		return alarmMinutesBefore;
	}

	/**
	 * Metoda zwracaj�ca dzien w dacie zdarzenia
	 * 
	 * @return - dzien w dacie zdarzenia
	 */
	public int getDay() {
		return day;
	}

	/**
	 * Metoda zwracaj�ca opis zdarzenia
	 * 
	 * @return - opis zdarzenia
	 */
	public String getDescription() {
		return description;
	}

	/**
	 * Metoda zwracaj�ca godzine wyst�pienia zdarzenia
	 * 
	 * @return - godzina wyst�pienia zdarzenia
	 */
	public int getHour() {
		return hour;
	}

	/**
	 * Metoda zwracaj�ca identyfikator zdarzenia
	 * 
	 * @return - identyfikator zdarzenia
	 */
	public int getId() {
		return id;
	}

	/**
	 * Metoda zwracaj�ca minuty z godziny wyst�pienia zdarzenia
	 * 
	 * @return - minuty z godziny wyst�pienia zdarzenia
	 */
	public int getMinute() {
		return minute;
	}

	/**
	 * Metoda miesiac w dacie zdarzenia
	 * 
	 * @return - miesiac w dacie zdarzenia
	 */
	public int getMonth() {
		return month;
	}

	/**
	 * Metoda zwracaj�ca miejsce zdarzenia
	 * 
	 * @return - miejsce zdarzenia
	 */
	public String getPlace() {
		return place;
	}

	/**
	 * Metoda zwracaj�ca rok w dacie zdarzenia
	 * 
	 * @return - rok w dacie zdarzenia
	 */
	public int getYear() {
		return year;
	}

	/**
	 * Metoda zwracaj�ca flage informuj�c� czy ustawiono alarm
	 * d�wi�kowy wyst�pienia zdarzenia
	 * 
	 * @return - flaga informuj�c� czy ustawiono alarm d�wi�kowy
	 *         wyst�pienia zdarzenia
	 */
	public boolean isAlarm() {
		return alarm;
	}

	/**
	 * Metoda ustawiaj�ca alarm d�wi�kowy
	 * 
	 * @param alarm
	 *            flaga okre�laj�ca w��czenie alarmu
	 */
	public void setAlarm(boolean alarm) {
		this.alarm = alarm;
	}

	/**
	 * Metoda ustawiaj�ca czas wyst�pienia przypomnienia o zdarzeniu
	 * 
	 * @param alarmMinutesBefore
	 *            czas wyst�pienia przypomnienia o zdarzeniu
	 */
	public void setAlarmMinutesBefore(int alarmMinutesBefore) {
		this.alarmMinutesBefore = alarmMinutesBefore;
	}

	/**
	 * Metoda ustawiaj�ca dzie� w dacie zdarzenia
	 * 
	 * @param day
	 *            dzie� w dacie zdarzenia
	 */
	public void setDay(int day) {
		this.day = day;
	}

	/**
	 * Metoda ustawiaj�ca opis zdarzenia
	 * 
	 * @param description
	 *            opis zdarzenia
	 */
	public void setDescription(String description) {
		this.description = description;
	}

	/**
	 * Metoda ustawiaj�ca godzin� wyst�pienia zdarzenia
	 * 
	 * @param hour
	 *            godzina wyst�pienia zdarzenia
	 */
	public void setHour(int hour) {
		this.hour = hour;
	}

	/**
	 * Metoda ustawiaj�ca identyfikator zdarzenia
	 * 
	 * @param id
	 *            identyfikator zdarzenia
	 */
	public void setId(int id) {
		this.id = id;
	}

	/**
	 * Metoda ustawiaj�ca minuty z godziny wyst�pienia zdarzenia
	 * 
	 * @param minute
	 *            minuty z godziny wyst�pienia zdarzenia
	 */
	public void setMinute(int minute) {
		this.minute = minute;
	}

	/**
	 * Metoda ustawiaj�ca miesiac w dacie zdarzenia
	 * 
	 * @param month
	 *            miesiac w dacie zdarzenia
	 */
	public void setMonth(int month) {
		this.month = month;
	}

	/**
	 * Metoda ustawiaj�ca miejsce zdarzenia
	 * 
	 * @param place
	 *            miejsce zdarzenia
	 */
	public void setPlace(String place) {
		this.place = place;
	}

	/**
	 * Metoda ustawiaj�ca rok w dacie zdarzenia
	 * 
	 * @param year
	 *            rok w dacie zdarzenia
	 */
	public void setYear(int year) {
		this.year = year;
	}
}
